package cn.iocoder.yudao.module.system.service.subjectcombination;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.subjectcombination.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.subjectcombination.SubjectCombinationDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 选科组合 Service 接口
 *
 * @author 芋道源码
 */
public interface SubjectCombinationService {

    /**
     * 创建选科组合
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createSubjectCombination(@Valid SubjectCombinationCreateReqVO createReqVO);

    /**
     * 更新选科组合
     *
     * @param updateReqVO 更新信息
     */
    void updateSubjectCombination(@Valid SubjectCombinationUpdateReqVO updateReqVO);

    /**
     * 删除选科组合
     *
     * @param id 编号
     */
    void deleteSubjectCombination(Long id);

    /**
     * 获得选科组合
     *
     * @param id 编号
     * @return 选科组合
     */
    SubjectCombinationDO getSubjectCombination(Long id);

    /**
     * 获得选科组合列表
     *
     * @param ids 编号
     * @return 选科组合列表
     */
    List<SubjectCombinationDO> getSubjectCombinationList(Collection<Long> ids);

    /**
     * 获得选科组合分页
     *
     * @param pageReqVO 分页查询
     * @return 选科组合分页
     */
    PageResult<SubjectCombinationDO> getSubjectCombinationPage(SubjectCombinationPageReqVO pageReqVO);

    /**
     * 获得选科组合列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 选科组合列表
     */
    List<SubjectCombinationDO> getSubjectCombinationList(SubjectCombinationPageReqVO exportReqVO);

    /**
     * 根据组合编码获取选科组合
     *
     * @param combinationCode 组合编码
     * @return 选科组合
     */
    SubjectCombinationDO getByCombinationCode(String combinationCode);

    /**
     * 自动识别和创建选科组合
     *
     * @param combinationCode 组合编码（如：物化生）
     * @return 选科组合信息
     */
    SubjectCombinationDO autoCreateSubjectCombination(String combinationCode);

    /**
     * 解析选科组合编码，获取包含的科目列表
     *
     * @param combinationCode 组合编码
     * @return 科目列表
     */
    List<String> parseSubjectsFromCode(String combinationCode);

    /**
     * 根据科目列表生成组合编码
     *
     * @param subjects 科目列表
     * @return 组合编码
     */
    String generateCombinationCode(List<String> subjects);

    /**
     * 根据科目列表生成组合名称
     *
     * @param subjects 科目列表
     * @return 组合名称
     */
    String generateCombinationName(List<String> subjects);

    /**
     * 判断组合类别（理科、文科、新高考）
     *
     * @param subjects 科目列表
     * @return 类别
     */
    String determineCombinationCategory(List<String> subjects);

    /**
     * 验证选科组合的有效性
     *
     * @param combinationCode 组合编码
     * @return 是否有效
     */
    boolean validateCombination(String combinationCode);

    /**
     * 获取所有启用的选科组合
     *
     * @return 选科组合列表
     */
    List<SubjectCombinationDO> getAllEnabledCombinations();

    /**
     * 根据类别获取启用的选科组合
     *
     * @param category 类别
     * @return 选科组合列表
     */
    List<SubjectCombinationDO> getEnabledCombinationsByCategory(String category);

    /**
     * 根据科目获取包含该科目的组合
     *
     * @param subjectName 科目名称
     * @return 选科组合列表
     */
    List<SubjectCombinationDO> getCombinationsBySubject(String subjectName);

    /**
     * 批量创建默认选科组合
     */
    void createDefaultCombinations();

    /**
     * 更新组合状态
     *
     * @param id 编号
     * @param status 状态
     */
    void updateCombinationStatus(Long id, Integer status);

}